package com.xiaolun.assist;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * CyclicBarrier
 * 的字面意思是可循环（Cyclic）使用的屏障（Barrier）。它要做的事情是，
 * 让一组线程到达一个屏障（也可以叫同步点）时被阻塞，
 * 直到最后一个线程到达屏障时，屏障才会开门，所有
 * 被屏障拦截的线程才会继续干活。
 * 线程进入屏障通过CyclicBarrier的await()方法。
 * <p>
 * 做加法，数到多少才开始
 * 集齐7颗龙珠就可以召唤神龙
 * (人到齐才能开会)
 */

public class CyclicBarrierDemo01 {
	private static final int NUMBER = 7;

	public static void main(String[] args) {
		CyclicBarrier cyclicBarrier = new CyclicBarrier(NUMBER, () -> {
			//数字到7（NUMBER）,龙就出来了
			System.out.println("*****集齐7颗龙珠就可以召唤神龙");
		});

		for (int i = 1; i <= 7; i++) {
			new Thread(() -> {
				try {
					System.out.println(Thread.currentThread().getName() + "\t 星龙珠被收集 ");
					cyclicBarrier.await(); //将线程在这里等待
				} catch (InterruptedException | BrokenBarrierException e) {
					e.printStackTrace();
				}
			}, String.valueOf(i)).start();
		}
	}
}
